/*!
 * \file WtSelStraFact.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader SEL选股策略工厂头文件
 * 
 * \details 该文件定义了WtSelStraFact类，实现SEL选股策略工厂接口，负责：
 *          - SEL选股策略的创建和销毁
 *          - 策略名称枚举和管理
 *          - 工厂名称标识
 *          - 选股策略实例生命周期管理
 *          
 *          支持的策略类型：
 *          - DtSel数据选股策略：基于技术指标的选股算法
 *          - 其他自定义SEL选股策略
 *          
 *          选股策略特性：
 *          - 多品种分析：同时分析多个交易标的
 *          - 量化筛选：基于技术指标和数据模型
 *          - 动态调仓：根据市场变化调整持仓组合
 *          - 风险分散：通过多品种投资降低单一风险
 *          
 *          应用场景：
 *          - 股票池筛选：从大量股票中选出优质标的
 *          - 期货品种轮动：在不同期货品种间切换
 *          - 组合优化：构建最优投资组合
 *          - 量化择时：结合择时信号进行投资决策
 *          
 *          作为选股交易系统的核心组件，支持策略的动态加载和管理
 */

#pragma once
#include "../Includes/SelStrategyDefs.h"

USING_NS_WTP;

/*!
 * \class WtSelStraFact
 * \brief WonderTrader SEL选股策略工厂
 * 
 * \details 该类实现了ISelStrategyFact接口，提供SEL选股策略的工厂管理功能：
 *          
 *          核心功能：
 *          - 策略创建：根据策略名称和ID创建具体选股策略实例
 *          - 策略销毁：安全释放策略实例资源
 *          - 策略枚举：遍历工厂支持的所有选股策略类型
 *          - 工厂标识：提供唯一的工厂名称标识
 *          
 *          设计模式：
 *          - 工厂模式：封装选股策略创建逻辑
 *          - 插件模式：支持动态加载和扩展
 *          - RAII模式：自动管理策略生命周期
 *          
 *          选股策略特性：
 *          - 多品种管理：同时处理多个交易标的
 *          - 数据驱动：基于历史数据和实时市场信息
 *          - 量化分析：使用数学模型和统计方法
 *          - 动态优化：根据市场环境调整选股规则
 *          
 *          技术架构：
 *          - 可扩展性：支持新的选股算法快速集成
 *          - 高性能：优化的数据处理和计算引擎
 *          - 容错性：完善的异常处理和错误恢复
 * 
 * \note 该工厂类专门用于SEL选股策略的统一管理和创建
 * \see ISelStrategyFact, SelStrategy, WtStraDtSel
 */
class WtSelStraFact : public ISelStrategyFact
{
public:
	/*!
	 * \brief 构造函数
	 */
	WtSelStraFact();
	
	/*!
	 * \brief 析构函数
	 */
	virtual ~WtSelStraFact();

public:
	/*!
	 * \brief 获取工厂名称
	 * \return 工厂名称字符串
	 * 
	 * \details 返回该工厂的唯一标识名称，用于区分不同的选股策略工厂
	 */
	virtual const char* getName() override;

	/*!
	 * \brief 创建选股策略实例
	 * \param name 策略名称（如"DtSel"）
	 * \param id 策略实例ID，用于区分同一策略的不同实例
	 * \return 创建的选股策略实例指针，失败返回nullptr
	 * 
	 * \details 根据指定的策略名称创建对应的选股策略实例：
	 *          - 支持的策略名称通过enumStrategy方法获取
	 *          - 每个策略实例具有唯一的ID标识
	 *          - 创建失败时返回nullptr，调用者需要检查返回值
	 *          - 选股策略需要特殊的多品种数据管理
	 */
	virtual SelStrategy* createStrategy(const char* name, const char* id) override;

	/*!
	 * \brief 枚举工厂支持的选股策略
	 * \param cb 枚举回调函数，用于接收策略名称
	 * 
	 * \details 遍历工厂支持的所有选股策略类型，通过回调函数返回策略名称：
	 *          - 回调函数格式：void callback(const char* strategyName)
	 *          - 可用于选股策略列表展示和动态配置
	 *          - 支持实时策略发现和管理
	 */
	virtual void enumStrategy(FuncEnumSelStrategyCallback cb) override;

	/*!
	 * \brief 删除选股策略实例
	 * \param stra 要删除的策略实例指针
	 * \return 删除成功返回true，失败返回false
	 * 
	 * \details 安全删除选股策略实例并释放相关资源：
	 *          - 检查策略指针有效性
	 *          - 验证策略是否属于本工厂创建
	 *          - 停止所有品种的数据订阅
	 *          - 清理选股计算缓存
	 *          - 执行安全删除操作
	 *          - 防止删除其他工厂创建的策略实例
	 */
	virtual bool deleteStrategy(SelStrategy* stra) override;
};

